{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cc126ad2",
   "metadata": {
    "id": "cc126ad2"
   },
   "source": [
    "# 数据准备"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d176ab4c",
   "metadata": {
    "id": "d176ab4c"
   },
   "source": [
    "# !wget https://storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9f3a185f",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9f3a185f",
    "outputId": "62a8ac4d-f772-43eb-b89d-59b0d5f84a86"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "文本长度: 1115394\n",
      "文本前100个字符:\n",
      "First Citizen:\n",
      "Before we proceed any further, hear me speak.\n",
      "\n",
      "All:\n",
      "Speak, speak.\n",
      "\n",
      "First Citizen:\n",
      "You\n",
      "字典大小: 65\n",
      "字典内容: ['\\n', ' ', '!', '$', '&', \"'\", ',', '-', '.', '3', ':', ';', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']\n",
      "\n",
      "字符到索引的映射示例:\n",
      "'F' -> 18\n",
      "'i' -> 47\n",
      "'r' -> 56\n",
      "'s' -> 57\n",
      "'t' -> 58\n",
      "' ' -> 1\n",
      "'C' -> 15\n",
      "'i' -> 47\n",
      "'t' -> 58\n",
      "'i' -> 47\n",
      "'z' -> 64\n",
      "'e' -> 43\n",
      "'n' -> 52\n",
      "':' -> 10\n",
      "'\n",
      "' -> 0\n",
      "'B' -> 14\n",
      "'e' -> 43\n",
      "'f' -> 44\n",
      "'o' -> 53\n",
      "'r' -> 56\n",
      "\n",
      "文本转换为数字序列的前20个元素:\n",
      "[18 47 56 57 58  1 15 47 58 47 64 43 52 10  0 14 43 44 53 56]\n",
      "将数字序列转回字符:\n",
      "First Citizen:\n",
      "Befor\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "\n",
    "# 读取Shakespeare文本文件\n",
    "with open('shakespeare.txt', 'r', encoding='utf-8') as f:\n",
    "    text = f.read()\n",
    "\n",
    "# 打印文本的前100个字符\n",
    "print(f\"文本长度: {len(text)}\")\n",
    "print(f\"文本前100个字符:\\n{text[:100]}\")\n",
    "\n",
    "# 创建字符级别的字典\n",
    "vocab = sorted(set(text))\n",
    "print(f\"字典大小: {len(vocab)}\")\n",
    "print(f\"字典内容: {vocab}\")\n",
    "\n",
    "# 创建字符到索引的映射\n",
    "char_to_idx = {char: idx for idx, char in enumerate(vocab)}\n",
    "# 创建索引到字符的映射\n",
    "idx_to_char = {idx: char for idx, char in enumerate(vocab)}\n",
    "\n",
    "# 打印映射示例\n",
    "print(\"\\n字符到索引的映射示例:\")\n",
    "for char in text[:20]:\n",
    "    print(f\"'{char}' -> {char_to_idx[char]}\")\n",
    "\n",
    "# 将文本转换为数字序列\n",
    "text_as_int = np.array([char_to_idx[c] for c in text]) #把全部文本都变为id\n",
    "print(f\"\\n文本转换为数字序列的前20个元素:\\n{text_as_int[:20]}\")\n",
    "print(f\"将数字序列转回字符:\\n{''.join([idx_to_char[idx] for idx in text_as_int[:20]])}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a08bc2a",
   "metadata": {
    "id": "4a08bc2a"
   },
   "source": [
    "# 把莎士比亚文集分成一个一个的样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e2dd4a94",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "e2dd4a94",
    "outputId": "ce92f772-1337-4609-a544-1aebd6c6f484"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "输入批次形状: torch.Size([64, 100])\n",
      "目标批次形状: torch.Size([64, 100])\n",
      "tensor([[ 1, 41, 53,  ..., 42,  1, 58],\n",
      "        [47, 56,  1,  ...,  1, 41, 46],\n",
      "        [51, 39, 58,  ...,  1, 47, 58],\n",
      "        ...,\n",
      "        [52, 41, 43,  ..., 50, 43, 42],\n",
      "        [42,  1, 51,  ..., 53, 53, 50],\n",
      "        [43, 42,  0,  ..., 58,  1, 54]])\n",
      "tensor([[41, 53, 52,  ...,  1, 58, 59],\n",
      "        [56,  1, 57,  ..., 41, 46, 43],\n",
      "        [39, 58, 58,  ..., 47, 58,  8],\n",
      "        ...,\n",
      "        [41, 43,  1,  ..., 43, 42,  1],\n",
      "        [ 1, 51, 63,  ..., 53, 50, 47],\n",
      "        [42,  0, 21,  ...,  1, 54, 39]])\n",
      "\n",
      "数据集大小: 11043\n",
      "批次数量: 172\n"
     ]
    }
   ],
   "source": [
    "# 定义序列长度和批次大小\n",
    "import torch\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "seq_length = 100  # 每个样本的序列长度\n",
    "batch_size = 64   # 每个批次的样本数量\n",
    "\n",
    "# 创建自定义数据集类\n",
    "class ShakespeareDataset(Dataset):\n",
    "    def __init__(self, text_as_int, seq_length):\n",
    "        self.text_as_int = text_as_int\n",
    "        self.seq_length = seq_length\n",
    "        self.sub_len = seq_length + 1 #一个样本的长度\n",
    "\n",
    "    def __len__(self):\n",
    "        # 计算可能的序列数量\n",
    "        return len(self.text_as_int)//(self.seq_length+1) #+1是因为要预测下一个字符\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        # 将numpy数组转换为长整型(Long)\n",
    "        return torch.tensor(self.text_as_int[idx*self.sub_len:(idx+1)*self.sub_len], dtype=torch.long) # 取出idx*sub_len到(idx+1)*sub_len的子序列，并转换为长整型\n",
    "\n",
    "# 定义collate函数，用于处理批次数据\n",
    "def collate_fct(batch):\n",
    "    # 将批次数据堆叠成张量，确保类型为long\n",
    "    # 将批次中的每个样本（都是形状相同的张量）沿着新的维度堆叠，形成一个批次张量\n",
    "    batch = torch.stack(batch)\n",
    "    # 输入序列是除了最后一个字符的所有字符\n",
    "    input_batch = batch[:, :-1]\n",
    "    # 目标序列是除了第一个字符的所有字符\n",
    "    target_batch = batch[:, 1:]\n",
    "    return input_batch, target_batch\n",
    "\n",
    "# 创建数据集实例\n",
    "shakespeare_dataset = ShakespeareDataset(text_as_int, seq_length)\n",
    "\n",
    "# 创建数据加载器，shuffle=True表示打乱数据，drop_last=True表示丢弃最后一个不完整的批次,collate_fn=collate_fct表示使用自定义的collate函数处理批次数据\n",
    "dataloader = DataLoader(shakespeare_dataset, batch_size=batch_size, shuffle=True, drop_last=True, collate_fn=collate_fct)\n",
    "\n",
    "# 打印示例，查看输入和目标\n",
    "for input_batch, target_batch in dataloader:\n",
    "    print(f\"输入批次形状: {input_batch.shape}\")\n",
    "    print(f\"目标批次形状: {target_batch.shape}\")\n",
    "\n",
    "    # 打印第一个样本的输入和目标\n",
    "    print(input_batch)\n",
    "    print(target_batch)\n",
    "    break\n",
    "\n",
    "print(f\"\\n数据集大小: {len(shakespeare_dataset)}\")\n",
    "print(f\"批次数量: {len(dataloader)}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0606fa96",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "0606fa96",
    "outputId": "406bd231-347a-4ef7-d78d-d627016f4024"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "样本数量：11043\n",
      "批次数量：172\n"
     ]
    }
   ],
   "source": [
    "print(f'样本数量：{1115394//101}')\n",
    "print(f'批次数量：{11043//64}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0353bb1a",
   "metadata": {
    "id": "0353bb1a"
   },
   "source": [
    "# 搭建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "50a9336b",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "50a9336b",
    "outputId": "0fbca995-c0fc-48db-9b1f-f4d8d5629fa0"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "ShakespeareRNN(\n",
      "  (embedding): Embedding(65, 256)\n",
      "  (rnn): RNN(256, 1024, batch_first=True)\n",
      "  (dense): Linear(in_features=1024, out_features=65, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "# 定义RNN模型\n",
    "class ShakespeareRNN(nn.Module):\n",
    "    def __init__(self, vocab_size, embedding_dim, hidden_dim, batch_size):\n",
    "        super(ShakespeareRNN, self).__init__()\n",
    "        self.embedding = nn.Embedding(vocab_size, embedding_dim)    # 嵌入层,输入形状，[vocab_size, embedding_dim]\n",
    "                                                                    # 输出形状: [batch_size, sequence_length, embedding_dim]\n",
    "        # RNN层输入形状：[embedding_dim, hidden_dim]\n",
    "        # 输出形状: [batch_size, sequence_length, hidden_dim]\n",
    "        self.rnn = nn.RNN(\n",
    "            embedding_dim,\n",
    "            hidden_dim,\n",
    "            num_layers=1,\n",
    "            bidirectional=False,\n",
    "            batch_first=True\n",
    "        )\n",
    "        # 全连接层，输出形状：[batch_size, sequence_length, vocab_size]\n",
    "        self.dense = nn.Linear(hidden_dim, vocab_size)\n",
    "\n",
    "    # 正向传播函数\n",
    "    def forward(self, x, hidden=None):\n",
    "        # 输入形状: [batch_size, sequence_length]\n",
    "        x = self.embedding(x)  # 形状: [batch_size, sequence_length, embedding_dim]\n",
    "        output, hidden = self.rnn(x, hidden)  # 形状: [batch_size, sequence_length, hidden_dim]\n",
    "        output = self.dense(output)  # 形状: [batch_size, sequence_length, vocab_size]\n",
    "        return output, hidden\n",
    "\n",
    "\n",
    "\n",
    "# 定义模型参数\n",
    "vocab_size = len(char_to_idx)  # 词汇表大小\n",
    "embedding_dim = 256  # 嵌入维度\n",
    "rnn_units = 1024  # RNN单元数量\n",
    "\n",
    "# 实例化模型\n",
    "model = ShakespeareRNN(vocab_size, embedding_dim, rnn_units, batch_size)\n",
    "print(model)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8ef60cf5",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "8ef60cf5",
    "outputId": "f4c87123-4532-47ea-ce03-78aabf219f31"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "输入形状: torch.Size([4, 100])\n",
      "输出形状: torch.Size([4, 100, 65])\n",
      "模型前向计算验证成功！\n"
     ]
    }
   ],
   "source": [
    "# 创建一个小批量数据来测试模型\n",
    "batch_size = 4\n",
    "seq_length = 100\n",
    "test_input = torch.randint(0, vocab_size, (batch_size, seq_length))\n",
    "\n",
    "# 进行前向计算\n",
    "with torch.no_grad():\n",
    "    output, hidden = model(test_input)\n",
    "\n",
    "# 打印输出形状\n",
    "print(f\"输入形状: {test_input.shape}\")\n",
    "print(f\"输出形状: {output.shape}\")\n",
    "\n",
    "# 验证输出是否符合预期\n",
    "assert output.shape == (batch_size, seq_length, vocab_size), \"输出形状不符合预期\"\n",
    "assert hidden.shape == (1, batch_size, rnn_units), \"隐藏状态形状不符合预期\"\n",
    "\n",
    "print(\"模型前向计算验证成功！\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d9f0a18",
   "metadata": {
    "id": "7d9f0a18"
   },
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "95e6a3f8",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 264,
     "referenced_widgets": [
      "a083eb328ef0442594444fe88b0c3c74",
      "be114327c0044d389d8678277d9e4863",
      "07b090d828f34e0aac1b1a04218e6af3",
      "db17802885094a5ab290a0d0bfc2a9af",
      "cfe7174768b44e9fababad173893f444",
      "7825245c420e4636b49021a887a7cf70",
      "b4f42034c79740aca4647a5be37efcff",
      "76aaf326c4a54607884ea999b2b7f628",
      "5035d55e924c4c56a726c49ee3633e5e",
      "e63614a5da9a44fdb2e448ce660ba2a4",
      "96f72507e2224ec497b6cd11cef2ae2b",
      "a5112fd9fcb4418b8d21cf2828cae029",
      "5612c047be374c718f2164314569f497",
      "7a682c5725ab4b19a48afda75ea3c143",
      "39e0f598953b485ebf9ffc35177c8990",
      "a2668720b82c426a9499936bb436e0a4",
      "dda456a6804b4bc4905aa19feb9cf3e9",
      "e0254845def74628a4039ea09af1811e",
      "7b8a5c4d55324e3693f500bf4c2339d1",
      "d092f514261b42a89f8c3e7cef83ca43",
      "10a94535082041ff91b022504787ef89",
      "7a4e1bc950dc42259c96477e68db0b1b",
      "e2b21c9f21674c9ca0481e310470d25b",
      "ec196662538341b1a3db00d8c7e9ac28",
      "d45e52fd71ef4fcb9924bfa4188bd354",
      "1b2a8e5fead247c3aa1788b6e6e09ff7",
      "e876e93fbace4a06b74cdaa925b00b9d",
      "d99ee79af6e64bf3bfd6316a705c594b",
      "a3aff55b511d4caf8dc709204d7ef6ba",
      "f1d724cd9bfd48e38fa7722d4ac0e2fa",
      "1e17147172484c3e9e43142ed7f85d4f",
      "7acff25bf4bc44a9ac7345b542b8f573",
      "1d2698cc27e9433fb551fb150e3d5a39",
      "e32bdde4f66b4c1a839d922a99097b47",
      "25e544230f654d94a00b9db8c5a6b98e",
      "ec2ac4f2558d4af79c70f577ff212b8d",
      "f6d13cd2aefc4bc98a465c2e9f237949",
      "1049b3f9282a436eb7dda0f86f1b763b",
      "b81ef563b3e54ba6a00aacad4c933cad",
      "6c071e75db96400db0671d86f9eae17c",
      "a1c63c751ec24b9ebdb4d7a2bf60e90b",
      "e3e7bcf50f554aef8eab437b90f0f727",
      "c3c75be18af647c88895213d7e67f9d6",
      "c758abc6fdbc49fc828034e70a2402c0",
      "b74b8ec13ba3439b89e50bddcb4d534f",
      "fe46958a636c4c9e8dd1458711b813bf",
      "35ed9fca612c4a8bb40e4d8ccad5cba0",
      "bb8a2be3165c4d349ffe36bf02980415",
      "ae326c37189d498a897df2725462778e",
      "332651e810bb4d718f4e9237bed27f41",
      "9f44b310e5ef4420bcfb887a633efafc",
      "abc8194e427d4a3c9be1405713c61be9",
      "6f09292306c742169cb94a704c90acde",
      "cbca798897974636ab60fd071ba859ed",
      "bd3e3d040a3f4985be863f42883e728c"
     ]
    },
    "id": "95e6a3f8",
    "outputId": "941ef0ea-184e-4ace-d087-8d63ff3d1cca"
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "轮次 1/5:   0%|          | 0/172 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "a083eb328ef0442594444fe88b0c3c74"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "轮次 1/5 完成, 平均损失: 2.0242\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "轮次 2/5:   0%|          | 0/172 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "a5112fd9fcb4418b8d21cf2828cae029"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "轮次 2/5 完成, 平均损失: 1.6241\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "轮次 3/5:   0%|          | 0/172 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "e2b21c9f21674c9ca0481e310470d25b"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "轮次 3/5 完成, 平均损失: 1.5066\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "轮次 4/5:   0%|          | 0/172 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "e32bdde4f66b4c1a839d922a99097b47"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "轮次 4/5 完成, 平均损失: 1.4435\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "轮次 5/5:   0%|          | 0/172 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "b74b8ec13ba3439b89e50bddcb4d534f"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "轮次 5/5 完成, 平均损失: 1.4019\n"
     ]
    }
   ],
   "source": [
    "from tqdm.auto import tqdm\n",
    "# 定义损失函数和优化器\n",
    "criterion = nn.CrossEntropyLoss() # 多分类，使用交叉熵损失\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 使用Adam优化器\n",
    "\n",
    "# 训练函数\n",
    "def train_step(model, dataloader, optimizer, criterion, epochs=5):\n",
    "    losses = []\n",
    "\n",
    "    for epoch in range(epochs):\n",
    "        model.train()\n",
    "        epoch_loss = 0\n",
    "\n",
    "        # 使用tqdm创建进度条\n",
    "        with tqdm(dataloader, desc=f\"轮次 {epoch+1}/{epochs}\") as pbar:\n",
    "            for input_batch, target_batch in pbar:\n",
    "                # 移动数据到设备\n",
    "                input_batch = input_batch.to(device)\n",
    "                target_batch = target_batch.to(device)\n",
    "                # 清空梯度\n",
    "                optimizer.zero_grad()\n",
    "\n",
    "                # 前向传播\n",
    "                output, _ = model(input_batch)\n",
    "\n",
    "                # 计算损失\n",
    "                # 重塑输出和目标以适应CrossEntropyLoss\n",
    "                output = output.reshape(-1, vocab_size) # 输出的维度为[batch_size, seq_len, vocab_size]，将输出和目标重 塑为[batch_size * seq_len, vocab_size]\n",
    "                target_batch = target_batch.reshape(-1) # 目标的维度为[batch_size, seq_len]，将目标重塑为[batch_size * seq_len]\n",
    "\n",
    "                loss = criterion(output, target_batch) # 计算损失\n",
    "\n",
    "                # 反向传播\n",
    "                loss.backward()\n",
    "                # 梯度更新\n",
    "                optimizer.step()\n",
    "                # 计算当前损失\n",
    "                current_loss = loss.item()\n",
    "                # 累加当前损失\n",
    "                epoch_loss += current_loss\n",
    "\n",
    "                # 更新进度条显示的损失值\n",
    "                pbar.set_postfix({\"损失\": f\"{current_loss:.4f}\"})\n",
    "\n",
    "        # 计算并记录每个epoch的平均损失\n",
    "        avg_epoch_loss = epoch_loss / len(dataloader)\n",
    "        losses.append(avg_epoch_loss)\n",
    "        print(f\"轮次 {epoch+1}/{epochs} 完成, 平均损失: {avg_epoch_loss:.4f}\")\n",
    "\n",
    "    return losses\n",
    "\n",
    "# 将模型移动到设备上\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "model = model.to(device)\n",
    "\n",
    "# 开始训练循环\n",
    "losses = train_step(model, dataloader, optimizer, criterion, epochs=5)\n",
    ""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2f863293",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 564
    },
    "id": "2f863293",
    "outputId": "5d418f8e-34fa-4d9b-d458-45cd8064c3e4"
   },
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ],
      "image/png": "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hHPSJdxX913cWZI069OdyiosMzkRAAAA4DwUJ5yzu4d3VLc2vsoprtCsT3eaHQcAAABwGooTzpnNatHzU3rLajG0dFuavtmZbnYkAAAAwCkoTvhVerXz1+1DO0iS/rhkh/JKKkxOBAAAADQ+ihN+tQdGdVaHEG9lFpTpT5/vMjsOAAAA0OgoTvjVPGxWzZ0SL8OQ/rvxqFbvP252JAAAAKBRUZzQKAbEBOnGC6IlSTMWbldRWaXJiQAAAIDGY2pxWrVqlSZMmKDIyEgZhqElS5bUeczLL7+s7t27y9PTU127dtW7777r/KCol4fHdVPbAE8dyy3R81/vNTsOAAAA0GhMLU5FRUXq3bu3Xn755Xrt/+qrr2rmzJmaNWuWdu7cqdmzZ2v69On67LPPnJwU9eFtd9OcSb0kSf9ad0gbD2WbnAgAAABoHG5mfvPx48dr/Pjx9d7/vffe05133qnf/OY3kqQOHTpow4YNmjt3riZMmOCsmGiAi7qE6qp+7fTxpqN6eOE2ffHbofKwWc2OBQAAAPwqphanhiorK5OHh0etbZ6enlq/fr0qKipks9lOe0xZWVnN6/z8fElSRUWFKirMXzr7pwyukKWxPDK2s1bszVTS8SK9+M1e/WFMZ9OytMT5uhLm61zM17mYr3MxX+divs7FfJ3LlebbkAyGw+FwODFLvRmGocWLF2vixIln3OfRRx/VO++8o6VLl6pv377atGmTLrvsMmVkZCg1NVURERGnHDNr1izNnj37lO0ffvihvLy8GvNHwM9syzb01l6rLHLowV5VivIxOxEAAABQW3FxsaZOnaq8vDz5+fmddd9mVZxKSko0ffp0vffee3I4HAoPD9f111+vefPmKT09XeHh4accc7ozTlFRUcrKyqpzOE2hoqJCCQkJGj169GnPmDVn9/9nq77YkaFubXy16K7zZbM2/S11LXm+roD5OhfzdS7m61zM17mYr3MxX+dypfnm5+crJCSkXsWpWV2q5+npqbfffluvvfaaMjIyFBERoddff12+vr4KDQ097TF2u112u/2U7TabzfR/UT/nankaw1MTe2ldUrb2pBforTWHdd9I8y7Za4nzdSXM17mYr3MxX+divs7FfJ2L+TqXK8y3Id+/WT7HyWazqV27drJarfroo4902WWXyWJplj9KixbiY9eTE3pKkv7x3QHtzygw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FSvUt29f2e12derUSfPnz3d6zuaqofNdsWLFKe9dwzCUnp7eNIGbmTlz5mjAgAHy9fVVWFiYJk6cqL1799Z5HL9/6+dc5svv3/p79dVXFR8fX/Nw0EGDBunLL7886zG8d+uvofPlvfvrPPfcczIMQw888MBZ92sO72GKk5P95z//0YMPPqgnn3xSmzdvVu/evTV27FhlZmaedv+1a9fq2muv1a233qotW7Zo4sSJmjhxonbs2NHEyZuHhs5XOvmU6rS0tJqPlJSUJkzcfBQVFal37956+eWX67V/cnKyLr30Uo0YMUKJiYl64IEHdNttt+nrr792ctLmqaHz/cnevXtrvX/DwsKclLB5W7lypaZPn64ffvhBCQkJqqio0JgxY1RUVHTGY/j9W3/nMl+J37/11a5dOz333HPatGmTNm7cqIsvvlhXXHGFdu7cedr9ee82TEPnK/HePVcbNmzQa6+9pvj4+LPu12zeww441cCBAx3Tp0+veV1VVeWIjIx0zJkz57T7X3311Y5LL7201rbzzz/fceeddzo1Z3PV0Pm+8847Dn9//yZK13JIcixevPis+zz88MOOnj171tr2m9/8xjF27FgnJmsZ6jPf5cuXOyQ5cnJymiRTS5OZmemQ5Fi5cuUZ9+H377mrz3z5/fvrBAYGOt58883Tfo737q93tvny3j03BQUFjs6dOzsSEhIcw4YNc9x///1n3Le5vIc54+RE5eXl2rRpk0aNGlWzzWKxaNSoUVq3bt1pj1m3bl2t/SVp7NixZ9y/NTuX+UpSYWGhoqOjFRUVVeffMKH+eO82jfPOO08REREaPXq01qxZY3acZiMvL0+SFBQUdMZ9eA+fu/rMV+L377moqqrSRx99pKKiIg0aNOi0+/DePXf1ma/Ee/dcTJ8+XZdeeukp783TaS7vYYqTE2VlZamqqkrh4eG1toeHh5/xvoT09PQG7d+anct8u3btqrfffluffPKJ3n//fVVXV2vw4ME6evRoU0Ru0c703s3Pz1dJSYlJqVqOiIgI/fOf/9TChQu1cOFCRUVFafjw4dq8ebPZ0VxedXW1HnjgAV144YWKi4s74378/j039Z0vv38bZvv27fLx8ZHdbtddd92lxYsXq0ePHqfdl/duwzVkvrx3G+6jjz7S5s2bNWfOnHrt31zew25mBwCa0qBBg2r9jdLgwYPVvXt3vfbaa3r66adNTAacXdeuXdW1a9ea14MHD9bBgwf14osv6r333jMxmeubPn26duzYoe+//97sKC1SfefL79+G6dq1qxITE5WXl6cFCxZo2rRpWrly5Rn/cI+Gach8ee82zJEjR3T//fcrISGhxS2iQXFyopCQEFmtVmVkZNTanpGRoTZt2pz2mDZt2jRo/9bsXOb7SzabTX369NGBAwecEbFVOdN718/PT56enialatkGDhxIGajDvffeq6VLl2rVqlVq167dWffl92/DNWS+v8Tv37Nzd3dXp06dJEn9+vXThg0b9Le//U2vvfbaKfvy3m24hsz3l3jvnt2mTZuUmZmpvn371myrqqrSqlWr9NJLL6msrExWq7XWMc3lPcylek7k7u6ufv366dtvv63ZVl1drW+//faM19EOGjSo1v6SlJCQcNbrblurc5nvL1VVVWn79u2KiIhwVsxWg/du00tMTOS9ewYOh0P33nuvFi9erO+++06xsbF1HsN7uP7OZb6/xO/fhqmurlZZWdlpP8d799c723x/iffu2Y0cOVLbt29XYmJizUf//v113XXXKTEx8ZTSJDWj97DZq1O0dB999JHDbrc75s+f79i1a5fjjjvucAQEBDjS09MdDofDccMNNzhmzJhRs/+aNWscbm5ujj//+c+O3bt3O5588kmHzWZzbN++3awfwaU1dL6zZ892fP31146DBw86Nm3a5LjmmmscHh4ejp07d5r1I7isgoICx5YtWxxbtmxxSHL85S9/cWzZssWRkpLicDgcjhkzZjhuuOGGmv2TkpIcXl5ejoceesixe/dux8svv+ywWq2Or776yqwfwaU1dL4vvviiY8mSJY79+/c7tm/f7rj//vsdFovFsWzZMrN+BJd29913O/z9/R0rVqxwpKWl1XwUFxfX7MPv33N3LvPl92/9zZgxw7Fy5UpHcnKyY9u2bY4ZM2Y4DMNwfPPNNw6Hg/fur9XQ+fLe/fV+uapec30PU5yawD/+8Q9H+/btHe7u7o6BAwc6fvjhh5rPDRs2zDFt2rRa+//3v/91dOnSxeHu7u7o2bOn4/PPP2/ixM1LQ+b7wAMP1OwbHh7uuOSSSxybN282IbXr+2n5619+/DTPadOmOYYNG3bKMeedd57D3d3d0aFDB8c777zT5Lmbi4bOd+7cuY6OHTs6PDw8HEFBQY7hw4c7vvvuO3PCNwOnm62kWu9Jfv+eu3OZL79/6++WW25xREdHO9zd3R2hoaGOkSNH1vyh3uHgvftrNXS+vHd/vV8Wp+b6HjYcDoej6c5vAQAAAEDzwz1OAAAAAFAHihMAAAAA1IHiBAAAAAB1oDgBAAAAQB0oTgAAAABQB4oTAAAAANSB4gQAAAAAdaA4AQAAAEAdKE4AAJyFYRhasmSJ2TEAACajOAEAXNZNN90kwzBO+Rg3bpzZ0QAArYyb2QEAADibcePG6Z133qm1zW63m5QGANBaccYJAODS7Ha72rRpU+sjMDBQ0snL6F599VWNHz9enp6e6tChgxYsWFDr+O3bt+viiy+Wp6engoODdccdd6iwsLDWPm+//bZ69uwpu92uiIgI3XvvvbU+n5WVpSuvvFJeXl7q3LmzPv3005rP5eTk6LrrrlNoaKg8PT3VuXPnU4oeAKD5ozgBAJq1xx9/XJMnT9bWrVt13XXX6ZprrtHu3bslSUVFRRo7dqwCAwO1YcMGffzxx1q2bFmtYvTqq69q+vTpuuOOO7R9+3Z9+umn6tSpU63vMXv2bF199dXatm2bLrnkEl133XXKzs6u+f67du3Sl19+qd27d+vVV19VSEhI0w0AANAkDIfD4TA7BAAAp3PTTTfp/fffl4eHR63tjz76qB599FEZhqG77rpLr776as3nLrjgAvXt21evvPKK3njjDT3yyCM6cuSIvL29JUlffPGFJkyYoNTUVIWHh6tt27a6+eab9cwzz5w2g2EY+uMf/6inn35a0sky5uPjoy+//FLjxo3T5ZdfrpCQEL399ttOmgIAwBVwjxMAwKWNGDGiVjGSpKCgoJp/HjRoUK3PDRo0SImJiZKk3bt3q3fv3jWlSZIuvPBCVVdXa+/evTIMQ6mpqRo5cuRZM8THx9f8s7e3t/z8/JSZmSlJuvvuuzV58mRt3rxZY8aM0cSJEzV48OBz+lkBAK6L4gQAcGne3t6nXDrXWDw9Peu1n81mq/XaMAxVV1dLksaPH6+UlBR98cUXSkhI0MiRIzV9+nT9+c9/bvS8AADzcI8TAKBZ++GHH0553b17d0lS9+7dtXXrVhUVFdV8fs2aNbJYLOratat8fX0VExOjb7/99ldlCA0N1bRp0/T+++/rr3/9q15//fVf9fUAAK6HM04AAJdWVlam9PT0Wtvc3NxqFmD4+OOP1b9/fw0ZMkQffPCB1q9fr7feekuSdN111+nJJ5/UtGnTNGvWLB0/flz33XefbrjhBoWHh0uSZs2apbvuukthYWEaP368CgoKtGbNGt133331yvfEE0+oX79+6tmzp8rKyrR06dKa4gYAaDkoTgAAl/bVV18pIiKi1rauXbtqz549kk6uePfRRx/pnnvuUUREhP7973+rR48ekiQvLy99/fXXuv/++zVgwAB5eXlp8uTJ+stf/lLztaZNm6bS0lK9+OKL+sMf/qCQkBBNmTKl3vnc3d01c+ZMHTp0SJ6enho6dKg++uijRvjJAQCuhFX1AADNlmEYWrx4sSZOnGh2FABAC8c9TgAAAABQB4oTAAAAANSBe5wAAM0WV5sDAJoKZ5wAAAAAoA4UJwAAAACoA8UJAAAAAOpAcQIAAACAOlCcAAAAAKAOFCcAAAAAqAPFCQAAAADqQHECAAAAgDr8H44mcZPET+SYAAAAAElFTkSuQmCC\n"
     },
     "metadata": {}
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# 绘制损失曲线\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(losses)\n",
    "plt.title('Training Loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "23093630",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "23093630",
    "outputId": "0372b30d-de6a-4633-9afc-d02caaa978e1"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "概率分布: tensor([0.1000, 0.2000, 0.3000, 0.4000])\n",
      "采样一个元素: 2 对应概率: 0.30000001192092896\n"
     ]
    }
   ],
   "source": [
    "# 理解torch.multinomial函数的小例子\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "\n",
    "# 创建一个概率分布\n",
    "probs = torch.tensor([0.1, 0.2, 0.3, 0.4])\n",
    "print(\"概率分布:\", probs)\n",
    "\n",
    "# 从概率分布中采样一个元素\n",
    "sample = torch.multinomial(probs, num_samples=1)\n",
    "print(\"采样一个元素:\", sample.item(), \"对应概率:\", probs[sample.item()].item())\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "df7cb7b7",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "df7cb7b7",
    "outputId": "ffc05131-0b65-4558-8f15-68854dc1e50f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "概率分布: tensor([0.0500, 0.1500, 0.5000, 0.3000])\n",
      "采样到的索引: 3\n",
      "对应的概率: 0.30000001192092896\n",
      "采样10000次后每个索引被采到的次数: [495.0, 1540.0, 5001.0, 2964.0]\n",
      "归一化后采样频率: [0.0494999997317791, 0.15399999916553497, 0.5001000165939331, 0.2964000105857849]\n"
     ]
    }
   ],
   "source": [
    "# 创建一个概率分布张量\n",
    "probs = torch.tensor([0.05, 0.15, 0.5, 0.3])  # 定义每个元素被采样的概率\n",
    "print(\"概率分布:\", probs)  # 打印概率分布\n",
    "\n",
    "# 从概率分布中采样一个元素的索引\n",
    "sample_idx = torch.multinomial(probs, num_samples=1)  # 采样一个元素的索引\n",
    "print(\"采样到的索引:\", sample_idx.item())  # 打印采样到的索引\n",
    "print(\"对应的概率:\", probs[sample_idx.item()].item())  # 打印采样到的元素的概率\n",
    "\n",
    "# 多次采样，统计分布\n",
    "counts = torch.zeros_like(probs)  # 创建一个与概率分布同形状的计数张量\n",
    "for _ in range(10000):  # 进行10000次采样\n",
    "    idx = torch.multinomial(probs, num_samples=1)  # 每次采样一个索引\n",
    "    counts[idx] += 1  # 对应索引的计数加一\n",
    "\n",
    "print(\"采样10000次后每个索引被采到的次数:\", counts.tolist())  # 打印每个索引被采到的次数\n",
    "print(\"归一化后采样频率:\", (counts / counts.sum()).tolist())  # 打印归一化后的采样频率\n",
    "\n",
    "# multinomial的功能是： # 说明multinomial的作用\n",
    "# 它根据给定的概率分布，从中随机采样指定数量的索引。 # 解释multinomial的采样方式\n",
    "# 例如，如果输入一个概率分布张量probs， # 举例说明输入\n",
    "# torch.multinomial(probs, num_samples=1)会返回一个索引， # 说明函数调用和返回\n",
    "# 该索引出现的概率与probs中对应的概率成正比。 # 解释采样概率\n",
    "# 这常用于根据概率分布进行随机选择，如文本生成时按概率采样下一个token。 # 说明实际应用场景\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "198c39a8",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 825
    },
    "id": "198c39a8",
    "outputId": "c724a94e-2885-4bef-b9be-2691cf482c2f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "原始logits值: tensor([1.0000, 2.0000, 5.0000, 3.0000, 0.5000])\n",
      "\n",
      "temperature=0.5时的概率分布:\n",
      "tensor([3.2848e-04, 2.4272e-03, 9.7919e-01, 1.7934e-02, 1.2084e-04])\n",
      "\n",
      "temperature=1.0时的概率分布:\n",
      "tensor([0.0151, 0.0410, 0.8234, 0.1114, 0.0091])\n",
      "\n",
      "temperature=2.0时的概率分布:\n",
      "tensor([0.0739, 0.1218, 0.5459, 0.2008, 0.0575])\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1200x600 with 3 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOf1JREFUeJzt3XmYVPWZPvyn2RrZVaQRA7ZLXFDjgkowk59LWnAGNc7EJWqEoHGJuxgVjAGXRDQqwRlUoqMxiybGLaPBgVGUcSMSQRKdCCqLILERxqER1Abp8/5RLy1tNzTdNN/qoj+f6+rrsk6dU/XUl6JuuftUVVGWZVkAAAAAQEKt8j0AAAAAAC2PUgoAAACA5JRSAAAAACSnlAIAAAAgOaUUAAAAAMkppQAAAABITikFAAAAQHJKKQAAAACSU0oBAAAAkJxSCgAAAIDklFJskqKiok36mTp1ar5HzZs777wz7r///nyPkcTixYvj5JNPjm7dukWXLl3im9/8ZsybN2+Tjj3iiCPqfO4cc8wxW3hqYEuTFfVrKVkxZ86cuOyyy+Kwww6L9u3bR1FRUSxYsKBBt/Hmm2/GMcccE506dYrtttsuzjjjjFi6dOmWGRhIRlbUr6VkxWOPPRannHJK7LrrrtGhQ4fYc8894/LLL4/ly5dv8m3IisJXlGVZlu8haP5+85vf1Lj8q1/9Kp5++un49a9/XWP70UcfHSUlJSlHazb23Xff6N69+1YfoCtXroyDDjooKioq4vLLL4+2bdvGz372s8iyLGbNmhXbb7/9Ro8/4ogjYu7cuTFmzJga23v16hVHHXXUlhwd2MJkRf1aSlbcf//9cdZZZ0Xfvn2jTZs2MWvWrJg/f36UlpZu0vHvvfdeHHjggdG1a9e4+OKLY+XKlXHrrbdGnz59Yvr06dGuXbst+wCALUZW1K+lZEX37t2jV69eccIJJ0SfPn3i9ddfjwkTJsSuu+4aM2fOjG222Wajx8uKrUObfA9AYfjOd75T4/Kf/vSnePrpp2tt31pkWRaffvppvS+ELWWO9d15553x9ttvx/Tp0+OQQw6JiIh//Md/jH333Tduu+22uPHGG+u9ja5du261zx1oyWRFy55jfccff3wsX748OnfuHLfeemvMmjWrQcffeOONsWrVqpgxY0b06dMnIiIOPfTQOProo+P++++Pc845ZwtMDaQgK1r2HOt75JFH4ogjjqixrV+/fjF06NB44IEH4nvf+95Gj5cVWwdv36PJVFVVxbhx42KfffaJ9u3bR0lJSZx77rnxf//3fzX2Ky0tjWOPPTamTp0aBx98cGyzzTax3377Vf8m4LHHHov99tsv2rdvH/369YvXXnutxvHf/e53o1OnTjFv3rwYNGhQdOzYMXr16hXXX399fPHEv4bONHny5OqZfv7zn0dExC9+8Ys46qijokePHlFcXBx9+/aNu+66q9bx//M//xP//d//XX3K8boX2GuvvTaKiopqrdf9999f6+0MG5tj+fLlcemll0bv3r2juLg4dt9997j55pujqqpq0/6AmsgjjzwShxxySHUhFRGx1157xTe+8Y34/e9/v8m389lnn8XKlSu3xIhAMyYrWkZWbLfddtG5c+dGH//oo4/GscceW/2PjIiIsrKy2GOPPRqUNUBhkhUtIyu+WEhFRPzzP/9zROTellcfWbF1cKYUTebcc8+N+++/P4YNGxYXX3xxzJ8/P8aPHx+vvfZavPTSS9G2bdvqfd9555047bTT4txzz43vfOc7ceutt8Zxxx0XEyZMiKuvvjrOP//8iIgYM2ZMnHzyyTFnzpxo1erzDnXt2rVxzDHHxFe/+tX46U9/GpMmTYrRo0fHZ599Ftdff32jZpozZ06ceuqpce6558bZZ58de+65Z0RE3HXXXbHPPvvE8ccfH23atIknn3wyzj///KiqqooLLrggIiLGjRsXF110UXTq1Cl++MMfRkQ0+nTjuub4+OOP4/DDD4/FixfHueeeG3369ImXX345Ro4cGe+//36MGzduo7e5cuXK+PTTT+u977Zt20bXrl03eH1VVVX89a9/jTPPPLPWdYceemj813/9V3z00Uf1/kPkrbfeio4dO8bq1aujpKQkzj777Bg1alSNPw9g6yQrtv6s2FyLFy+ODz74IA4++OBa1x166KHx1FNPbbH7BpoHWdFys6K8vDwicm/t2xhZsRXJoBEuuOCCbP2nzwsvvJBFRPbAAw/U2G/SpEm1tu+8885ZRGQvv/xy9bbJkydnEZFts8022bvvvlu9/ec//3kWEdlzzz1XvW3o0KFZRGQXXXRR9baqqqps8ODBWbt27bKlS5c2eqZJkybVeqwff/xxrW2DBg3Kdt111xrb9tlnn+zwww+vte/o0aOzuv6q/eIXv8giIps/f369c9xwww1Zx44ds7feeqvG9hEjRmStW7fOFi5cWOv217duzer7qWv+9S1dujSLiOz666+vdd0dd9yRRUQ2e/bsjd7GmWeemV177bXZo48+mv3qV7/Kjj/++CwispNPPnmjxwGFR1a0zKz4oltuuaXWY9iYP//5z1lEZL/61a9qXXfFFVdkEZF9+umnDZoBaL5khaxY31lnnZW1bt261nxfJCu2Hs6Uokk8/PDD0bVr1zj66KNj2bJl1dv79esXnTp1iueeey5OO+206u19+/aNAQMGVF/u379/REQcddRRNU6/XLd93rx5tU7vvPDCC6v/u6ioKC688MKYOHFiPPPMM/Htb3+7wTPtsssuMWjQoFqPbf33XVdUVMSaNWvi8MMPj8mTJ0dFRUWT/7a4rjkefvjh+PrXvx7bbrttjcdSVlYWN910Uzz//PNx+umnb/A2r7zyyk16n/6222670es/+eSTiIgoLi6udV379u1r7LMh9957b43LZ5xxRpxzzjlxzz33xGWXXRZf/epX650TKEyyouk056zYXJuaNXVdDxQ+WdF0Ci0rHnzwwbj33nvjyiuvjC9/+csb3VdWbD2UUjSJt99+OyoqKqJHjx51Xv/BBx/UuLx+QERE9Qtw796969z+xfdqt2rVKnbdddca2/bYY4+IiOr3Ujd0pl122aXO/V566aUYPXp0TJs2LT7++OMa122p8Piit99+O/7617/GDjvsUOcxX3wsX9S3b9/o27fvZs+2LkgrKytrXbfuNN7GfHji5ZdfHvfcc08888wzSinYismKptOcs2JzbamsAQqDrGg6hZQVL7zwQpx11lkxaNCg+MlPflLv/rJi66GUoklUVVVFjx494oEHHqjz+i++6LVu3brO/Ta0PfvCBw1uiZnqetGaO3dufOMb34i99torxo4dG71794527drFU089FT/72c826cMA6/owwojc+9frUtccVVVVcfTRR8eVV15Z5zHrgnNDKioq6j2DKSKiXbt2sd12223w+u222y6Ki4vj/fffr3Xdum29evWq936+aN3/NHz44YcNPhYoHLJiw7amrNhcO+64Y0TEBrNmXRYBWydZsWFba1b85S9/ieOPPz723XffeOSRR6JNm/prClmx9VBK0SR22223eOaZZ+JrX/takka6qqoq5s2bV+NF86233oqI3DdNNNVMTz75ZFRWVsYTTzxR47cwzz33XK19NxQS605dXb58eXTr1q16+7vvvrvJc+y2226xcuXKKCsr2+Rj1nfJJZfEL3/5y3r3O/zww6u/raQurVq1iv322y9effXVWte98sorseuuuzbq25bmzZsXEbUDHdi6yIqWkRWba6eddooddtihzqyZPn16HHDAAVvsvoH8kxUtKyvmzp0bxxxzTPTo0SOeeuqp6NSp0ybNISu2Hq3q3wXqd/LJJ8fatWvjhhtuqHXdZ599FsuXL2/y+xw/fnz1f2dZFuPHj4+2bdvGN77xjSabad1vWNb/jUpFRUX84he/qLVvx44d67zN3XbbLSIinn/++eptq1at2qQX83VOPvnkmDZtWkyePLnWdcuXL4/PPvtso8dfeeWV8fTTT9f7c9ttt9U7y4knnhh//vOfawTAnDlz4tlnn42TTjqpxr6zZ8+OhQsXVl9esWJFrVNssyyLH//4xxERdb73Hth6yIqWkxUNMXfu3Jg7d26Nbd/61rfij3/8YyxatKh625QpU+Ktt96qlTXA1kVWtJysKC8vj4EDB0arVq1i8uTJG/0FtazYejlTiiZx+OGHx7nnnhtjxoyJWbNmxcCBA6Nt27bx9ttvx8MPPxy33357nHjiiU12f+3bt49JkybF0KFDo3///vGf//mfMXHixLj66qurX8yaYqaBAwdGu3bt4rjjjotzzz03Vq5cGffcc0/06NGj1qmi/fr1i7vuuit+/OMfx+677x49evSIo446KgYOHBh9+vSJs846K6644opo3bp13HfffbHDDjvUKGw25oorrognnngijj322Pjud78b/fr1i1WrVsXrr78ejzzySCxYsGCjX5valO/9Pv/88+Oee+6JwYMHxw9+8INo27ZtjB07NkpKSuLyyy+vse/ee+9d47ckM2fOjFNPPTVOPfXU2H333eOTTz6Jxx9/PF566aU455xz4qCDDmqSGYHmSVa0nKyoqKiIf/u3f4uI3GeoROT+0detW7fo1q1bjQ8VXvePvnWf3RIRcfXVV8fDDz8cRx55ZFxyySWxcuXKuOWWW2K//faLYcOGNcmMQPMkK1pOVhxzzDExb968uPLKK+PFF1+MF198sfq6kpKSOProo6svy4qtWL6+9o/C9sWvbl3n7rvvzvr165dts802WefOnbP99tsvu/LKK7O///3v1fvsvPPO2eDBg2sdGxHZBRdcUGPb/Pnzs4jIbrnlluptQ4cOzTp27JjNnTs3GzhwYNahQ4espKQkGz16dLZ27domnSnLsuyJJ57IvvKVr2Tt27fPSktLs5tvvjm77777an3tanl5eTZ48OCsc+fOtb4GdcaMGVn//v2zdu3aZX369MnGjh27wa9u3dAcH330UTZy5Mhs9913z9q1a5d17949O+yww7Jbb701W716dZ3HbCmLFi3KTjzxxKxLly5Zp06dsmOPPTZ7++23a+33xXWYN29edtJJJ2WlpaVZ+/btsw4dOmT9+vXLJkyYkFVVVSV8BEAKsqLlZsW6P5O6fnbeeeca++688861tmVZlr3xxhvVf3bdunXLTj/99Ky8vDzNAwCSkRUtNys2lBNffMxZJiu2ZkVZ1ohPeoM8+u53vxuPPPJIrFy5Mt+jANBMyQoA6iMrIP98phQAAAAAySmlAAAAAEhOKQUAAABAcg0upZ5//vk47rjjolevXlFUVBR/+MMf6j1m6tSpcdBBB0VxcXHsvvvucf/99zdiVMi5//77ve8bmjlZQb7JCmj+ZAX5Jisg/xpcSq1atSr233//uOOOOzZp//nz58fgwYPjyCOPjFmzZsWll14a3/ve92Ly5MkNHhaAwiArAKiPrABgs759r6ioKB5//PE44YQTNrjPVVddFRMnTow33nijetu3v/3tWL58eUyaNKmxdw1AgZAVANRHVgC0TG229B1MmzYtysrKamwbNGhQXHrppRs8prKyMiorK6svV1VVxYcffhjbb799FBUVbalRAVq8LMvio48+il69ekWrVuk+dlBWABQOWQFAfTY1K7Z4KVVeXh4lJSU1tpWUlMSKFSvik08+iW222abWMWPGjInrrrtuS48GwAYsWrQovvSlLyW7P1kBUHhkBQD1qS8rtngp1RgjR46M4cOHV1+uqKiIPn36xKJFi6JLly55nAxg67ZixYro3bt3dO7cOd+j1EtWAOSHrACgPpuaFVu8lOrZs2csWbKkxrYlS5ZEly5d6vxtRkREcXFxFBcX19repUsX4QGQQOq3NMgKgMIjKwCoT31ZscXfBD5gwICYMmVKjW1PP/10DBgwYEvfNQAFQlYAUB9ZAbD1aXAptXLlypg1a1bMmjUrInJfzTpr1qxYuHBhROROkR0y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AABAckopAAAAAJJTSgEAAACQnFIKAAAAgOSUUgAAAAAkp5QCAAAAIDmlFAAAAADJKaUAAAAASE4pBQAAAEBySikAAAAAklNKAQAAAJCcUgoAAACA5JRSAAAAACSnlAIAAAAgOaUUAAAAAMkppQAAAABITikFAAAAQHJKKQAAAACSU0oBAAAAkJxSCgAAAIDklFIAAAAAJKeUAgAAACA5pRQAAAAAySmlAAAAAEhOKQUAAABAckopAAAAAJJTSgEAAACQnFIKAAAAgOSUUgAAAAAkp5QCAAAAIDmlFAAAAADJKaUAAAAASE4pBQAAAEBySikAAAAAklNKAQAAAJCcUgoAAACA5JRSAAAAACSnlAIAAAAgOaUUAAAAAMkppQAAAABITikFAAAAQHJKKQAAAACSU0oBAAAAkJxSCgAAAIDkGlVK3XHHHVFaWhrt27eP/v37x/Tp0zfpuN/97ndRVFQUJ5xwQmPuFoACIisAqI+sAGjZGlxKPfTQQzF8+PAYPXp0zJw5M/bff/8YNGhQfPDBBxs9bsGCBfGDH/wgvv71rzd6WAAKg6wAoD6yAoAGl1Jjx46Ns88+O4YNGxZ9+/aNCRMmRIcOHeK+++7b4DFr166N008/Pa677rrYddddN2tgAJo/WQFAfWQFAA0qpVavXh0zZsyIsrKyz2+gVasoKyuLadOmbfC466+/Pnr06BFnnXVW4ycFoCDICgDqIysAiIho05Cdly1bFmvXro2SkpIa20tKSmL27Nl1HvPiiy/GvffeG7Nmzdrk+6msrIzKysrqyytWrGjImADkkawAoD6yAoCILfztex999FGcccYZcc8990T37t03+bgxY8ZE165dq3969+69BacEIJ9kBQD1kRUAW6cGnSnVvXv3aN26dSxZsqTG9iVLlkTPnj1r7T937txYsGBBHHfccdXbqqqqcnfcpk3MmTMndtttt1rHjRw5MoYPH159ecWKFQIEoEDICgDqIysAiGhgKdWuXbvo169fTJkypfrrV6uqqmLKlClx4YUX1tp/r732itdff73GtmuuuSY++uijuP322zcYCMXFxVFcXNyQ0QBoJmQFAPWRFQBENLCUiogYPnx4DB06NA4++OA49NBDY9y4cbFq1aoYNmxYREQMGTIkdtpppxgzZky0b98+9t133xrHd+vWLSKi1nYAth6yAoD6yAoA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HFkhK9YnK2qTFU2nEJ8LsiJHVsiK9cmK2vKRFS2mlCpEP/3pT+Nf//VfY8KECfHKK69Ex44dY9CgQfHpp5/me7SkVq1aFf/wD/8QN998c75HyZuPP/44Zs6cGT/60Y9i5syZ8dhjj8WcOXPi+OOPz/doye2xxx4xfvz4eP311+PFF1+M0tLSGDhwYCxdujTfo+XF448/Hn/605+iV69e+R6FPJEVObJCVqxPVtQkK5AVObJCVqxPVtSUt6zIWoChQ4dmEVHjZ/78+dnUqVOzQw45JGvXrl3Ws2fP7KqrrsrWrFlTfdzhhx+eXXLJJdWX//jHP2ZdunTJfvOb32RZlmULFy7MTjrppKxr167Ztttumx1//PHZ/Pnza9zvN7/5zeyWW27JevbsmW233XbZ+eefn61evbremauqqrKePXtmt9xyS/W25cuXZ8XFxdlvf/vbFrMO65s/f34WEdlrr73WqMe//jyFvA7rTJ8+PYuI7N13323R61BRUZFFRPbMM8+0uHV47733sp122il74403sp133jn72c9+1qg1IKcQnwuyojZZUZOsyJEVsqKpFOJzQVbUJitqkhU5siI/WdEiSqnly5dnAwYMyM4+++zs/fffz95///3svffeyzp06JCdf/752Ztvvpk9/vjjWffu3bPRo0dXH7f+k+OBBx7IOnfunD355JNZlmXZ6tWrs7333js788wzs7/+9a/Z3/72t+y0007L9txzz6yysjLLstyTo0uXLtl5552Xvfnmm9mTTz6ZdejQIbv77rvrnXnu3Ll1vlD+v//3/7KLL764xazD+poqPAp9HdZ5+umns6KioqyioqLFrkNlZWV2yy23ZF27ds2WLl3aotZh7dq12ZFHHpmNGzcuy7LMPzSaQCE+F2RFbbKiJlkhK2RF0yrE54KsqE1W1CQrZEU+s6JFlFJZVrt9vPrqq7M999wzq6qqqt52xx13ZJ06dcrWrl1b45jx48dnXbt2zaZOnVq9769//etax1dWVmbbbLNNNnny5CzLck+OnXfeOfvss8+q9znppJOyU045pd55X3rppSwisr///e81tp900knZySef3LAHv55CW4f1NVV4ZFlhr0OWZdknn3ySHXTQQdlpp53W4GPXV6jr8OSTT2YdO3bMioqKsl69emXTp09v8GNfXyGuw4033pgdffTR1ffhHxpNo9CeC7KiNlnxOVkhK2TFllFozwVZUZus+JyskBX5zoo2DX6/31bizTffjAEDBkRRUVH1tq997WuxcuXKeO+996JPnz4REfHII4/EBx98EC+99FIccsgh1fv+5S9/iXfeeSc6d+5c43Y//fTTmDt3bvXlffbZJ1q3bl19eccdd4zXX399Sz2sBrMOOYW0DmvWrImTTz45siyLu+66q0HH1qdQ1uHII4+MWbNmxbJly+Kee+6Jk08+OV555ZXo0aNHgx9zXZr7OsyYMSNuv/32mDlzZo0ZaXrN/bmQinXIKaR1kBWyQlak09yfC6lYh5xCWgdZISuaQ1a02FJqUx144IExc+bMuO++++Lggw+u/oNauXJl9OvXLx544IFax+ywww7V/922bdsa1xUVFUVVVVW999uzZ8+IiFiyZEnsuOOO1duXLFkSBxxwQGMeymbJ1zo0N/leh3XB8e6778azzz4bXbp0aeQj2Tz5XoeOHTvG7rvvHrvvvnt89atfjS9/+ctx7733xsiRIxv5iBonX+vwwgsvxAcffFAdYhERa9eujcsvvzzGjRsXCxYsaOQjorFkRU6+Xxuai3yvg6zIkRWyormRFTn5fm1oLvK9DrIiR1bkPytaTCnVrl27WLt2bfXlvffeOx599NHIsqz6D/yll16Kzp07x5e+9KXq/Xbbbbe47bbb4ogjjojWrVvH+PHjIyLioIMOioceeih69OixRf4C77LLLtGzZ8+YMmVKdVisWLEiXnnllfj+97/f6NsttHXYUgpxHdYFx9tvvx3PPfdcbL/99pt9m4W4DnWpqqqKysrKRh9faOtwxhlnRFlZWY1tgwYNijPOOCOGDRvW5PfXkhTac0FWbFmFuA6yYsNkhaxoKoX2XJAVW1YhroOs2DBZkT4rWiW5l2agtLQ0XnnllViwYEEsW7Yszj///Fi0aFFcdNFFMXv27PiP//iPGD16dAwfPjxataq5LHvssUc899xz8eijj8all14aERGnn356dO/ePb75zW/GCy+8EPPnz4+pU6fGxRdfHO+9995mz1tUVBSXXnpp/PjHP44nnngiXn/99RgyZEj06tUrTjjhhEbfbqGtQ0TEhx9+GLNmzYq//e1vERExZ86cmDVrVpSXlzf6NgttHdasWRMnnnhivPrqq/HAAw/E2rVro7y8PMrLy2P16tWNvt1CW4dVq1bF1VdfHX/605/i3XffjRkzZsSZZ54ZixcvjpNOOqnRt1to67D99tvHvvvuW+Onbdu20bNnz9hzzz03+/ZbskJ7LsiKz8kKWbGOrMiRFVtOoT0XZMXnZIWsWEdW5DSHrGgxpdQPfvCDaN26dfTt2zd22GGHWLNmTTz11FMxffr02H///eO8886Ls846K6655po6j99zzz3j2Wefjd/+9rdx+eWXR4cOHeL555+PPn36xL/8y7/E3nvvHWeddVZ8+umnTdZgXnnllXHRRRfFOeecE4ccckisXLkyJk2aFO3bt2/0bRbiOjzxxBNx4IEHxuDBgyMi4tvf/nYceOCBMWHChEbfZqGtw+LFi+OJJ56I9957Lw444IDYcccdq39efvnlRt9uoa1D69atY/bs2fGtb30r9thjjzjuuOPif//3f+OFF16IffbZp9G3W2jrwJZTiM8FWZEjK2TFOrKCLa0QnwuyIkdWyIp1ZEXzUZRlWZbvIQAAAABoWVrMmVIAAAAANB9KqTx54YUXolOnThv8aSmsQ451yLEOOdaBdTwXcqxDjnXIsQ451oF1PBdyrEOOdcixDjmFsA7evpcnn3zySSxevHiD1+++++4Jp8kf65BjHXKsQ451YB3PhRzrkGMdcqxDjnVgHc+FHOuQYx1yrENOIayDUgoAAACA5Lx9DwAAAIDklFIAAAAAJKeUAgAAACA5pRQAAAAAySmlAAAAAEhOKQUAAABAckopAAAAAJJTSgEAAACQ3P8HRGJz5xdCZa8AAAAASUVORK5CYII=\n"
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\n",
      "解释:\n",
      "- 较低的temperature (如0.5) 使概率分布更加尖锐，最高概率的token被选中的可能性更大\n",
      "- 标准temperature (1.0) 保持原始概率分布\n",
      "- 较高的temperature (如2.0) 使概率分布更加平坦，增加了采样的随机性\n"
     ]
    }
   ],
   "source": [
    "# 展示temperature参数对softmax输出的影响\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 创建一个模拟的logits输出\n",
    "logits = torch.tensor([1.0, 2.0, 5.0, 3.0, 0.5])\n",
    "print(\"原始logits值:\", logits)\n",
    "\n",
    "# 使用不同的temperature值\n",
    "temperatures = [0.5, 1.0, 2.0]\n",
    "\n",
    "plt.figure(figsize=(12, 6))\n",
    "\n",
    "for i, temp in enumerate(temperatures):\n",
    "    # 应用temperature\n",
    "    scaled_logits = logits / temp\n",
    "\n",
    "    # 应用softmax获取概率分布\n",
    "    probabilities = F.softmax(scaled_logits, dim=0)\n",
    "\n",
    "    # 打印结果\n",
    "    print(f\"\\ntemperature={temp}时的概率分布:\")\n",
    "    print(probabilities)\n",
    "\n",
    "    # 可视化\n",
    "    plt.subplot(1, len(temperatures), i+1)\n",
    "    plt.bar(range(len(probabilities)), probabilities.numpy())\n",
    "    plt.title(f\"Temperature = {temp}\")\n",
    "    plt.ylim(0, 1)\n",
    "    plt.xticks(range(len(probabilities)), [f\"token_{i}\" for i in range(len(probabilities))])\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "print(\"\\n解释:\")\n",
    "print(\"- 较低的temperature (如0.5) 使概率分布更加尖锐，最高概率的token被选中的可能性更大\")\n",
    "print(\"- 标准temperature (1.0) 保持原始概率分布\")\n",
    "print(\"- 较高的temperature (如2.0) 使概率分布更加平坦，增加了采样的随机性\")\n",
    "\n",
    "# temperature参数用于控制softmax输出概率分布的“平滑度” # 说明temperature的作用\n",
    "# 当temperature较低（如0.5）时，概率分布会变得更加尖锐，模型更倾向于选择概率最高的token # 解释低temperature的效果\n",
    "# 当temperature为1.0时，概率分布保持原始形状 # 说明标准temperature的效果\n",
    "# 当temperature较高（如2.0）时，概率分布会变得更加平坦，增加了生成的多样性和随机性 # 解释高temperature的效果\n",
    "# 在文本生成等任务中，合理调整temperature可以在“创造性”和“合理性”之间取得平衡 # 说明实际应用意义\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b595d015",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 157
    },
    "id": "b595d015",
    "outputId": "518a44ec-44d1-47eb-af0a-cf54b637d20f"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "torch.Size([1, 5])\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "\"hellows.\\nWe cause,\\nCook news, buk let's taint;\\nAnd all ourselves and farewell?\\nBut a bargaries of Wirtue,\\nMore mark!\\nAnd tell her for light,\\nWhop being a part of scope and rebe\\nCitizens will you by my pass'd;\\nMorrow it, hath condition of Northure,\\nComen faith of goad give me, and make condility, let him show thy sige, would he looks you.\\n\\nANTONIO:\\nNo with the goddess having betares?\\n\\nTRANIO:\\nMy sound, or dove thy redered to my woes,\\nI'd where thou haddly point age,\\nThe untouch, buck'd with with its bescer and enterch mank behal: you have dights with the deat, sir: and throughly pict of Warward.\\n\\nKING RICHARD III:\\nTherefore, if We save most an horses, wiltamity, my voices,\\nWhen would not have you make heavyosame\\nTo your itsel,\\n'This haste uncle.\\n\\nLUCENIS:\\nNever in this not to the general.\\n\\nBIANCA:\\nWere for this? and contcant,\\nvow I doubt well,\\nWhere are we seek thy afferyble followers from my state,\\nOncase contral\\nShame I cannot for them Mostlenfels you with used the scipe that\\nat 'ffer'd, p\""
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "string"
      }
     },
     "metadata": {},
     "execution_count": 11
    }
   ],
   "source": [
    "# 生成文本的函数\n",
    "def generate_text(model, start_string, char2idx, idx2char, num_generate=1000, temperature=1.0): # 输入模型、起始字符串、字符到索引的映射、索引到字符的映射、生成字符数量和温度参数\n",
    "    # 设置模型为评估模式，关闭dropout等训练专用层\n",
    "    model.eval()\n",
    "\n",
    "    # 将起始字符串的每个字符转换为对应的索引\n",
    "    input_indices = [char2idx[char] for char in start_string]\n",
    "    # 构造输入张量，并在第0维增加一个批次维度，同时放到指定设备上\n",
    "    input_tensor = torch.tensor(input_indices, dtype=torch.long).unsqueeze(0).to(device)\n",
    "    # 打印输入张量的形状，便于调试\n",
    "    print(input_tensor.shape)\n",
    "    # 初始化生成的文本为起始字符串\n",
    "    generated_text = start_string\n",
    "\n",
    "    # 初始化隐藏状态为None，模型会自动初始化\n",
    "    hidden = None\n",
    "\n",
    "    # 在不计算梯度的上下文中进行推理，提高效率\n",
    "    with torch.no_grad():\n",
    "        # 循环生成指定数量的字符\n",
    "        for _ in range(num_generate):\n",
    "            # 将当前输入和隐藏状态送入模型，获得输出和新的隐藏状态\n",
    "            output, hidden = model(input_tensor, hidden)\n",
    "\n",
    "            # 取最后一个时间步的输出，并用temperature调整logits的分布\n",
    "            # 取模型输出output的最后一个时间步（即当前输入序列最后一个字符对应的输出），output的形状通常为[batch_size, seq_len, vocab_size]，这里[:, -1, :]表示取所有batch的最后一个时间步的所有词表分数\n",
    "            # 然后将该输出除以temperature参数，temperature用于控制softmax分布的平滑度，temperature<1会使分布更尖锐，>1会使分布更平坦\n",
    "            # 这样调整后的logits可以影响后续采样的多样性和确定性\n",
    "            logits = output[:, -1, :] / temperature\n",
    "\n",
    "            # 对调整后的logits应用softmax，得到概率分布\n",
    "            probabilities = F.softmax(logits, dim=-1)\n",
    "            # 按概率分布采样下一个字符的索引\n",
    "            predicted_id = torch.multinomial(probabilities, 1) # torch.multinomial()函数用于从概率分布中采样一个索引，probabilities为概率分布，num_samples为采样数量，返回一个包含num_samples个索引的tensor\n",
    "\n",
    "            # 将采样得到的索引转换为字符\n",
    "            generated_char = idx2char[predicted_id.item()]\n",
    "            # 将新生成的字符拼接到生成文本后面\n",
    "            generated_text += generated_char\n",
    "\n",
    "            # 更新输入张量为当前预测的字符索引，准备下一个时间步\n",
    "            input_tensor = predicted_id\n",
    "\n",
    "    # 返回最终生成的文本\n",
    "    return generated_text\n",
    "\n",
    "# 调用生成文本函数，传入模型、起始字符串和索引映射\n",
    "generate_text(model, 'hello', char_to_idx, idx_to_char)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  },
  "colab": {
   "provenance": [],
   "gpuType": "T4"
  },
  "accelerator": "GPU",
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "a083eb328ef0442594444fe88b0c3c74": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_be114327c0044d389d8678277d9e4863",
       "IPY_MODEL_07b090d828f34e0aac1b1a04218e6af3",
       "IPY_MODEL_db17802885094a5ab290a0d0bfc2a9af"
      ],
      "layout": "IPY_MODEL_cfe7174768b44e9fababad173893f444"
     }
    },
    "be114327c0044d389d8678277d9e4863": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7825245c420e4636b49021a887a7cf70",
      "placeholder": "​",
      "style": "IPY_MODEL_b4f42034c79740aca4647a5be37efcff",
      "value": "轮次 1/5: 100%"
     }
    },
    "07b090d828f34e0aac1b1a04218e6af3": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_76aaf326c4a54607884ea999b2b7f628",
      "max": 172,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_5035d55e924c4c56a726c49ee3633e5e",
      "value": 172
     }
    },
    "db17802885094a5ab290a0d0bfc2a9af": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e63614a5da9a44fdb2e448ce660ba2a4",
      "placeholder": "​",
      "style": "IPY_MODEL_96f72507e2224ec497b6cd11cef2ae2b",
      "value": " 172/172 [00:04&lt;00:00, 49.44it/s, 损失=1.7752]"
     }
    },
    "cfe7174768b44e9fababad173893f444": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "7825245c420e4636b49021a887a7cf70": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b4f42034c79740aca4647a5be37efcff": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "76aaf326c4a54607884ea999b2b7f628": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "5035d55e924c4c56a726c49ee3633e5e": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "e63614a5da9a44fdb2e448ce660ba2a4": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "96f72507e2224ec497b6cd11cef2ae2b": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "a5112fd9fcb4418b8d21cf2828cae029": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_5612c047be374c718f2164314569f497",
       "IPY_MODEL_7a682c5725ab4b19a48afda75ea3c143",
       "IPY_MODEL_39e0f598953b485ebf9ffc35177c8990"
      ],
      "layout": "IPY_MODEL_a2668720b82c426a9499936bb436e0a4"
     }
    },
    "5612c047be374c718f2164314569f497": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_dda456a6804b4bc4905aa19feb9cf3e9",
      "placeholder": "​",
      "style": "IPY_MODEL_e0254845def74628a4039ea09af1811e",
      "value": "轮次 2/5: 100%"
     }
    },
    "7a682c5725ab4b19a48afda75ea3c143": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7b8a5c4d55324e3693f500bf4c2339d1",
      "max": 172,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_d092f514261b42a89f8c3e7cef83ca43",
      "value": 172
     }
    },
    "39e0f598953b485ebf9ffc35177c8990": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_10a94535082041ff91b022504787ef89",
      "placeholder": "​",
      "style": "IPY_MODEL_7a4e1bc950dc42259c96477e68db0b1b",
      "value": " 172/172 [00:03&lt;00:00, 49.29it/s, 损失=1.6115]"
     }
    },
    "a2668720b82c426a9499936bb436e0a4": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "dda456a6804b4bc4905aa19feb9cf3e9": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e0254845def74628a4039ea09af1811e": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7b8a5c4d55324e3693f500bf4c2339d1": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "d092f514261b42a89f8c3e7cef83ca43": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "10a94535082041ff91b022504787ef89": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "7a4e1bc950dc42259c96477e68db0b1b": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e2b21c9f21674c9ca0481e310470d25b": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_ec196662538341b1a3db00d8c7e9ac28",
       "IPY_MODEL_d45e52fd71ef4fcb9924bfa4188bd354",
       "IPY_MODEL_1b2a8e5fead247c3aa1788b6e6e09ff7"
      ],
      "layout": "IPY_MODEL_e876e93fbace4a06b74cdaa925b00b9d"
     }
    },
    "ec196662538341b1a3db00d8c7e9ac28": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_d99ee79af6e64bf3bfd6316a705c594b",
      "placeholder": "​",
      "style": "IPY_MODEL_a3aff55b511d4caf8dc709204d7ef6ba",
      "value": "轮次 3/5: 100%"
     }
    },
    "d45e52fd71ef4fcb9924bfa4188bd354": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_f1d724cd9bfd48e38fa7722d4ac0e2fa",
      "max": 172,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_1e17147172484c3e9e43142ed7f85d4f",
      "value": 172
     }
    },
    "1b2a8e5fead247c3aa1788b6e6e09ff7": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7acff25bf4bc44a9ac7345b542b8f573",
      "placeholder": "​",
      "style": "IPY_MODEL_1d2698cc27e9433fb551fb150e3d5a39",
      "value": " 172/172 [00:03&lt;00:00, 49.46it/s, 损失=1.5044]"
     }
    },
    "e876e93fbace4a06b74cdaa925b00b9d": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "d99ee79af6e64bf3bfd6316a705c594b": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "a3aff55b511d4caf8dc709204d7ef6ba": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f1d724cd9bfd48e38fa7722d4ac0e2fa": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "1e17147172484c3e9e43142ed7f85d4f": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "7acff25bf4bc44a9ac7345b542b8f573": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "1d2698cc27e9433fb551fb150e3d5a39": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "e32bdde4f66b4c1a839d922a99097b47": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_25e544230f654d94a00b9db8c5a6b98e",
       "IPY_MODEL_ec2ac4f2558d4af79c70f577ff212b8d",
       "IPY_MODEL_f6d13cd2aefc4bc98a465c2e9f237949"
      ],
      "layout": "IPY_MODEL_1049b3f9282a436eb7dda0f86f1b763b"
     }
    },
    "25e544230f654d94a00b9db8c5a6b98e": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_b81ef563b3e54ba6a00aacad4c933cad",
      "placeholder": "​",
      "style": "IPY_MODEL_6c071e75db96400db0671d86f9eae17c",
      "value": "轮次 4/5: 100%"
     }
    },
    "ec2ac4f2558d4af79c70f577ff212b8d": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_a1c63c751ec24b9ebdb4d7a2bf60e90b",
      "max": 172,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_e3e7bcf50f554aef8eab437b90f0f727",
      "value": 172
     }
    },
    "f6d13cd2aefc4bc98a465c2e9f237949": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_c3c75be18af647c88895213d7e67f9d6",
      "placeholder": "​",
      "style": "IPY_MODEL_c758abc6fdbc49fc828034e70a2402c0",
      "value": " 172/172 [00:03&lt;00:00, 49.43it/s, 损失=1.4334]"
     }
    },
    "1049b3f9282a436eb7dda0f86f1b763b": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b81ef563b3e54ba6a00aacad4c933cad": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "6c071e75db96400db0671d86f9eae17c": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "a1c63c751ec24b9ebdb4d7a2bf60e90b": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e3e7bcf50f554aef8eab437b90f0f727": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "c3c75be18af647c88895213d7e67f9d6": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "c758abc6fdbc49fc828034e70a2402c0": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "b74b8ec13ba3439b89e50bddcb4d534f": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HBoxModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_fe46958a636c4c9e8dd1458711b813bf",
       "IPY_MODEL_35ed9fca612c4a8bb40e4d8ccad5cba0",
       "IPY_MODEL_bb8a2be3165c4d349ffe36bf02980415"
      ],
      "layout": "IPY_MODEL_ae326c37189d498a897df2725462778e"
     }
    },
    "fe46958a636c4c9e8dd1458711b813bf": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_332651e810bb4d718f4e9237bed27f41",
      "placeholder": "​",
      "style": "IPY_MODEL_9f44b310e5ef4420bcfb887a633efafc",
      "value": "轮次 5/5: 100%"
     }
    },
    "35ed9fca612c4a8bb40e4d8ccad5cba0": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "FloatProgressModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_abc8194e427d4a3c9be1405713c61be9",
      "max": 172,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_6f09292306c742169cb94a704c90acde",
      "value": 172
     }
    },
    "bb8a2be3165c4d349ffe36bf02980415": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "HTMLModel",
     "model_module_version": "1.5.0",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_cbca798897974636ab60fd071ba859ed",
      "placeholder": "​",
      "style": "IPY_MODEL_bd3e3d040a3f4985be863f42883e728c",
      "value": " 172/172 [00:03&lt;00:00, 48.93it/s, 损失=1.4116]"
     }
    },
    "ae326c37189d498a897df2725462778e": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "332651e810bb4d718f4e9237bed27f41": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9f44b310e5ef4420bcfb887a633efafc": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "abc8194e427d4a3c9be1405713c61be9": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "6f09292306c742169cb94a704c90acde": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "ProgressStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "cbca798897974636ab60fd071ba859ed": {
     "model_module": "@jupyter-widgets/base",
     "model_name": "LayoutModel",
     "model_module_version": "1.2.0",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "bd3e3d040a3f4985be863f42883e728c": {
     "model_module": "@jupyter-widgets/controls",
     "model_name": "DescriptionStyleModel",
     "model_module_version": "1.5.0",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
